ORACLE自动扩展表空间添加数据文件

以下均在sys用户以sysdba登录后执行,否则会因为权限问题报错

1.建wifi.dba_data_files_log记录表
先判断这张表是否已经存在,如果不存在,则建表(原dba_data_files的字段加上time,sql两个字段)

DECLARE
  STR VARCHAR2(200);
BEGIN
  SELECT COUNT(1)
    INTO STR
    FROM DBA_TAB_COLUMNS
   WHERE TABLE_NAME = 'DBA_DATA_FILES_LOG'
     AND OWNER = 'WIFI';
  IF STR = 0 THEN
    execute immediate 'create table WIFI.DBA_DATA_FILES_LOG
(
  file_name       VARCHAR2(513),
  file_id         NUMBER,
  tablespace_name VARCHAR2(30),
  bytes           NUMBER,
  blocks          NUMBER,
  status          VARCHAR2(9),
  relative_fno    NUMBER,
  autoextensible  VARCHAR2(3),
  maxbytes        NUMBER,
  maxblocks       NUMBER,
  increment_by    NUMBER,
  user_bytes      NUMBER,
  user_blocks     NUMBER,
  online_status   VARCHAR2(7),
  time            DATE default sysdate,
  sql             VARCHAR2(4000)
)
tablespace TBS_WIFI
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  ) ';
  END IF;
END;
/

2.备份以前的数据文件信息
先判断WIFI.DBA_DATA_FILES_LOG表是否没有记录,如果没有记录则证明刚建立还未备份以前数据,先备份

DECLARE
  num number(20);
BEGIN
  SELECT COUNT(1) INTO num FROM WIFI.DBA_DATA_FILES_LOG;
  IF num = 0 THEN
    insert into wifi.dba_data_files_log
      (file_name,
       file_id,
       tablespace_name,
       bytes,
       blocks,
       status,
       relative_fno,
       autoextensible,
       maxbytes,
       maxblocks,
       increment_by,
       user_bytes,
       user_blocks,
       online_status,
       time,
       sql)
      select file_name,
             file_id,
             tablespace_name,
             bytes,
             blocks,
             status,
             relative_fno,
             autoextensible,
             maxbytes,
             maxblocks,
             increment_by,
             user_bytes,
             user_blocks,
             online_status,
             sysdate,
             ''
        from dba_data_files;
    commit;
  END IF;
END;
/

3.显示授权给WIFI用户

grant alter database to WIFI;
grant alter tablespace to WIFI;
grant select on dba_data_files to WIFI;
grant select on dba_free_space to WIFI;

4.创建扩展表空间的存储过程

create or replace procedure wifi.DBA_ADD_TABLESPACE is
begin
  declare
    v_maxbytes       number(20);
    --v_flag           number(10);
    v_sql            varchar2(4000);
    v_filename       varchar2(512);
    v_tablespacename varchar2(200);
    v_autoextensible varchar2(10);
    cursor c_job is
      select a.tablespace_name tsname
      --,round((a.bytes_alloc - nvl(b.bytes_free, 0)) / maxbytes * 100) pct  --使用百分比
        from (select f.tablespace_name,
                     sum(f.bytes) bytes_alloc,
                     sum(decode(f.autoextensible,
                                'YES',
                                f.maxbytes,
                                'NO',
                                f.bytes)) maxbytes
                from dba_data_files f
               group by tablespace_name) a,
             (select f.tablespace_name, sum(f.bytes) bytes_free
                from dba_free_space f
               group by tablespace_name) b
       where a.tablespace_name = b.tablespace_name(+)
         and round((a.bytes_alloc - nvl(b.bytes_free, 0)) / maxbytes * 100) > 85
         and (a.tablespace_name in
             ('TBSIDX_WIFI_TERMINAL_TRACE_LOG',
               'TBS_IDX',
               'TBS_WIFI',
               'TBSIDX_WIFI_HOTSPOT_TRACE_LOG',
               'TBSIDX_TERMINAL_NETLOG') or
             a.tablespace_name like 'TBS_TERMINAL_TRACE_LOG%' or
             a.tablespace_name like 'TBS_TERMINAL_INFO%' or
             a.tablespace_name like 'TBS_HOTSPOT_TRACE_LOG%' or
             a.tablespace_name like 'TBS_TERMINAL_NETLOG%' or
             a.tablespace_name like 'TBS_WIFI_TERMINAL%');
  begin
    open c_job;
    loop
      fetch c_job
        into v_tablespacename;
      exit when c_job%notfound;

      select file_name, tablespace_name, autoextensible, maxbytes
        into v_filename, v_tablespacename, v_autoextensible, v_maxbytes
        from (select rownum num,
                     file_name,
                     tablespace_name,
                     autoextensible,
                     maxbytes
                from dba_data_files
               where tablespace_name = v_tablespacename
                 and instr(UPPER(file_name), '_ADDTIME.DBF') = 0
               order by file_id)
       where num = 1;

      if v_maxbytes < 29205763686 then
        v_sql := 'alter database datafile ''' || v_filename ||
                 '''autoextend on next 500m maxsize unlimited';
        execute immediate v_sql;
      else
        v_sql := 'alter database datafile ''' || v_filename ||
                 '''autoextend on next 500m maxsize unlimited';
        execute immediate v_sql;
        --插入日志表中,此处会修改两次,一次修改数据文件,一次添加数据文件
        insert into wifi.dba_data_files_log
          (file_name, tablespace_name, autoextensible, sql)
        values
          (v_filename, v_tablespacename, v_autoextensible, v_sql);

        v_sql := 'alter tablespace ' || v_tablespacename ||
                 ' add datafile ''' ||
                 replace(v_filename,
                         '.dbf',
                         '_' ||
                         round((sysdate -
                               to_date('19700101080000', 'yyyymmddhh24miss')) * 24 * 3600) ||
                         '_addtime.dbf') ||
                 ''' size 1G autoextend on next 500m maxsize unlimited';
        execute immediate v_sql;
      end if;
      --插入日志表中
      insert into wifi.dba_data_files_log
        (file_name, tablespace_name, autoextensible, sql)
      values
        (v_filename, v_tablespacename, v_autoextensible, v_sql);
      commit;
    end loop;
    close c_job;
  end;
end;
/

5.创建JOB

DECLARE
  num number(20);
  job number;
BEGIN
  select count(1)
    into num
    from dba_jobs
   where what = 'wifi.dba_add_tablespace;';
  IF num = 0 THEN
    sys.dbms_job.submit(job       => job,
                        what      => 'wifi.dba_add_tablespace;',
                        next_date => to_date('31-05-2016 01:00:00',
                                             'dd-mm-yyyy hh24:mi:ss'),
                        interval  => 'TRUNC(sysdate) + 1 +1/ (24)');
    commit;
  END IF;
END;
/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值